home *** CD-ROM | disk | FTP | other *** search
- * Program.: CROSSREF.PRG
- * Author..: Roy M. Moore, modified by Luis A. Castro
- * Date....: 11/1/83, 08/26/84
- * Notice..: Copyright 1983, Roy M. Moore, All Rights Reserved.
- * Version.: dBASE II, version 2.4x
- * Notes...: Creates a reference table of variables for up to
- * 30 command files.
- *
- CLEAR
- SET TALK OFF
- SET RAW ON
- STORE "PRG" TO extension
- *
- ERASE
- @ 2, 0 SAY "GENERATE CROSS-REFERENCE TABLE"
- @ 2,72 SAY DATE()
- @ 3, 0 SAY "========================================"
- @ 3,40 SAY "========================================"
- ACCEPT "Enter output filename " TO outfile
- ? "Enter command filename(s) [separated by commas] "
- ACCEPT TO mfiles
- STORE "N" TO listit
- @ 9, 0 SAY "Print command files? [Y/N] ";
- GET listit PICTURE "!"
- READ
- *
- * ---Separate list of files.
- STORE '11' TO item
- DO WHILE ',' $ mfiles
- STORE $( mfiles, 1, @(',',mfiles) - 1 ) TO filename&item
- STORE $( mfiles, @(',',mfiles) + 1 ) TO mfiles
- STORE STR( VAL( item ) + 1, 2 ) TO item
- ENDDO
- STORE mfiles TO filename&item
- STORE item TO item:max
- *
- * ---Check to see if command file(s) exist.
- DO WHILE item >= "11"
- STORE !( TRIM( filename&item ) ) + "." TO filename&item
- STORE $( filename&item, 1,;
- @(".",filename&item) - 1 ) TO filename&item
- IF .NOT. FILE( filename&item + "." + extension )
- ? "&filename&item" + " DOES NOT EXIST"
- CLEAR
- RETURN
- ENDIF
- STORE STR( VAL( item ) - 1, 2 ) TO item
- ENDDO
- *
- * ---The following is a list of the dBASE II "reserved" words.
- * ---Feel free to add or delete what you wish.
- *
- STORE ",*,AND,USE,WAIT,TO,SET,SKIP,NOT,OR,?," +;
- "ACCEPT,ALL,APPEND,READ,ON,SAY,BELL,BLANK,WHILE," +;
- "BOTTOM,WITH,CASE,CHR,CLEAR," TO tokens1
- STORE tokens1 +;
- "COMMAND,CONFIRM,CONSOLE,CONTINUE,COPY,COUNT,CREATE," +;
- "DATE,DELETE,DELIMITED,DISPLAY,DO,EDIT,EJECT,ELSE," +;
- "ENDCASE,ENDDO," TO tokens1
- *
- STORE ",ENDIF,ENDTEXT,EOF,ERASE,ESCAPE,EXCEPT,EXTENDED," +;
- "FIELD,FILE,FILES,FIND,FOR,ADD,,FORM,FORMAT,FROM,GET," +;
- "GETS,GO,GOTO,HEADING,IF,INDEX," TO tokens2
- STORE tokens2 +;
- "INPUT,INSERT,INT,INTENSITY,JOIN,LEN,LIKE,LINKAGE," +;
- "LIST,LOAD,LOCATE,LOOP,MARGIN,MEMORY,MODIFY,NOTE,OFF," +;
- "OTHERWISE," TO tokens2
- *
- STORE ",PACK,PEEK,PICTURE,POKE,PRIMARY,PRINT,QUIT,RAW," +;
- "BEFORE,RECALL,RECORD,RELEASE,REMARK,RENAME,REPLACE," +;
- "REPORT,RESET,RESTORE,RETURN," TO tokens3
- STORE tokens3 +;
- "SAVE,SCREEN,SDF,SECONDARY,SELECT,SORT,STATUS,"+;
- "STORE,STR,STRUCTURE,SUM,TALK,TEST,TEXT,TOP,TOTAL," +;
- "TRIM,TYPE," TO tokens3
- *
- STORE ",ALTERNATE,UPDATE,VAL,CALL,DESCENDING,ADDITIVE,"+;
- "ASCENDING,EXACT,CANCEL,CHANGE,COLON," TO tokens4
- *
- * ---Setup the CROSSREF files.
- SELECT PRIMARY
- USE Crossget
- COPY STRUCTURE TO Crossget.$$$
- USE Crossget.$$$
- *
- SELECT SECONDARY
- USE Crossput
- COPY STRUCTURE TO Crossput.$$$
- USE Crossput.$$$
- INDEX ON PUT:token + PUT:file TO Crossput
- *
- SELECT PRIMARY
- SET ALTERNATE TO &outfile
- *
- * ---Now, let's start generating the cross-reference table.
- @ 10,0 SAY " "
- STORE item:max TO item
- *
- DO WHILE item >= "11"
- *
- STORE filename&item + "." + extension TO mfile
- ?
- ? "Appending command file " + mfile + "... "
- APPEND FROM &mfile SDF
- GO TOP
- IF listit = "Y"
- ? "Printing command file to " + outfile + "..."
- SET ALTERNATE ON
- SET CONSOLE OFF
- ?
- ? "Filename: " + filename&item
- ?
- LIST
- ?
- ? ".PA"
- SET CONSOLE ON
- SET ALTERNATE OFF
- GO TOP
- ENDIF
- *
- * ---Process the command lines.
- ?
- ? "Getting the variable names... "
- ?
- DO WHILE .NOT. EOF
- *
- STORE TRIM( GET:line ) TO workline
- IF workline = " " .AND. LEN( workline ) = 1
- * ---It must be a blank line.
- SKIP
- LOOP
- ENDIF
- *
- * ---Strip leading control characters and blanks.
- STORE 1 TO ptr
- STORE LEN( workline ) TO line:len
- DO WHILE RANK( $(workline,ptr,1) ) < 33 .AND. ptr < line:len
- STORE ptr + 1 TO ptr
- ENDDO
- STORE $( workline, ptr ) TO workline
- *
- * ---Ignore comment lines.
- IF workline = "*"
- SKIP
- LOOP
- ENDIF
- *
- STORE !( workline ) + " " TO workline
- STORE STR( #, 5 ) TO linenumber
- *
- * ---NOTE: This section of dBASE II code can be
- * ---rewritten in assembly code for faster execution.
- *
- * ---Parse a single command line, until end-of-string.
- STORE 1 TO ptr, lastptr
- STORE LEN( workline ) TO line:len
- *
- DO WHILE lastptr <= line:len
- *
- * ---Skip everything but string delimiters ( " ' [ )
- * ---and alpha characters.
- STORE lastptr TO ptr
- STORE RANK( $( workline, ptr, 1 ) ) TO num
- DO WHILE num <> 34 .AND. num <> 39 .AND. num <> 91 .AND.;
- ( num < 65 .OR. num > 90 ) .AND. ptr <= line:len
- STORE ptr + 1 TO ptr
- IF ptr <= line:len
- STORE RANK( $( workline, ptr, 1 ) ) TO num
- ENDIF
- ENDDO
- STORE ptr TO startptr, lastptr
- IF ptr > line:len
- LOOP
- ENDIF
- * ---Locate a token in the line.
- DO CASE
- CASE num > 64 .AND. num < 91
- * ---Alpha characters.
- DO WHILE ptr <= line:len .AND.;
- ((num>64 .AND. num<91) .OR. (num>47 .AND. num<59))
- STORE ptr + 1 TO ptr
- IF ptr <= line:len
- STORE RANK( $( workline, ptr, 1 ) ) TO num
- ENDIF
- ENDDO
- CASE num = 34 .OR. num = 39 .OR. num = 91
- * ---Literal string.
- IF num = 91
- STORE 93 TO num
- ENDIF
- STORE @( CHR(num), $( workline, ptr + 1 ) ) TO pos
- IF pos = 0
- * ---Could not find matching string delimiter.
- STORE line:len + 1 TO ptr, lastptr
- LOOP
- ENDIF
- STORE ptr + pos + 1 TO ptr, lastptr
- LOOP
- ENDCASE
- STORE ptr TO lastptr
- *
- * ---END-OF-NOTE: Rewrite in assembly code up to this point.
- *
- STORE $( workline, startptr, lastptr - startptr ) TO token
- STORE "," + token + "," TO token1
- *
- * ---If reserved word then get next token.
- * ---DO CASE is used instead of IF...ENDIF to reduce
- * ---the amount of code executed if a match is found.
- DO CASE
- CASE token1 $ tokens1
- LOOP
- CASE token1 $ tokens2
- LOOP
- CASE token1 $ tokens3
- LOOP
- CASE token1 $ tokens4
- LOOP
- ENDCASE
- ?? token + ","
- *
- * ---Check to see if token is already in the CROSSPUT table:
- STORE $( token + " ", 1, 10 ) +;
- $( filename&item + " ", 1, 8 ) TO key:value
- SELECT SECONDARY
- FIND "&key:value"
- *
- IF # = 0
- * ---Token is not in the reference table.
- * ---Create a record for the new token.
- APPEND BLANK
- REPLACE PUT:token WITH token,;
- PUT:file WITH filename&item,;
- PUT:line WITH linenumber
- ELSE
- * ---Token is already in the reference table.
- * ---Just add the command line number.
- REPLACE PUT:line WITH TRIM( PUT:line ) + linenumber
- ENDIF
- *
- ENDDO
- SELECT PRIMARY
- SKIP
- ENDDO
- *
- * ---Initialize for the next command file.
- STORE STR( VAL( item ) - 1, 2 ) TO item
- USE Crossget
- COPY STRUCTURE TO Crossget.$$$
- USE Crossget.$$$
- *
- ENDDO
- *
- * ---Print cross-reference table from CROSSPUT.$$$
- ?
- ? "Printing cross-reference table... "
- SET CONSOLE OFF
- SET ALTERNATE ON
- ?
- ? "VARIABLE FILENAME OCCURRENCES"
- ? "========== ======== ====================="
- *
- SELECT SECONDARY
- GO TOP
- * ---The constant "work:width" should be a multiple of five.
- STORE 50 TO work:width
- STORE " " TO last:token
- DO WHILE .NOT. EOF
- IF PUT:token <> last:token
- ? PUT:token + " "
- ?? PUT:file + " "
- ELSE
- ? $( STR( 0, 13 ), 1, 12 ) + PUT:file + " "
- ENDIF
- ?? $( PUT:line, 1, work:width )
- *
- * ---Print the occurrence lines that follow.
- STORE work:width + 1 TO work:count
- DO WHILE work:count < 250
- IF LEN( TRIM ( $( PUT:line, work:count ) ) ) > 1
- ? $( STR( 0, 23 ), 1, 22 ) +;
- $( PUT:line, work:count, work:width )
- ENDIF
- STORE work:count + work:width TO work:count
- ENDDO
- *
- STORE PUT:token TO last:token
- SKIP
- ENDDO
- ?
- SET ALTERNATE OFF
- SET ALTERNATE TO
- SET CONSOLE ON
- CLEAR
- DELETE FILE Crossget.$$$
- DELETE FILE Crossput.$$$
- DELETE FILE Crossput.ndx
- ?
- ? "Finished..."
- *
- SET RAW OFF
- SET TALK ON
- RETURN
- * EOF: CROSSREF.PRG